<?php
/**************************************
 * Auth Class
 * Brainfucker.ru (c) Oleg Illarionov
 **************************************/

class auth {
	# результат проверки авторизации
	var $authorised=false;
	var $login='';
	var $password='';
	
	# префикс для осуществления нескольких видов авторизаций адновременно
	var $cookieprofix='';

	/**
	 * Конструктор, получает логин, пароль. Если они не указаны - берёт из REQUEST
	 *
	 * @param string $login
	 * @param string $password
	 */
	function auth($login='', $password='') {
		if (!empty($login) || !empty($password)) {
			$this->login = $login;
			$this->password = $password;
		} elseif(!empty($_POST['login'])) {
			$this->login = $_POST['login'];
			$this->password = $_POST['password'];
		} elseif(!empty($_COOKIE[$this->cookieprofix.'login'])) {
			$this->login = $_COOKIE[$this->cookieprofix.'login'];
			$this->password = $_COOKIE[$this->cookieprofix.'password'];
		}
		//print_r($_REQUEST); die();
		if (!preg_match("/^[a-f,0-9]{32}$/",$this->password)) $this->password=md5($this->password);
	}
	
	/**
	 * указать логин пользователя
	 *
	 * @param str $login
	 */
	function setLogin($login) {
		$this->login=$login;
	}
	
	/**
	 * указать пароль пользователя
	 *
	 * @param str $password
	 */
	function setPassword($password) {
		$this->password=$password;
		if (!preg_match("/^[a-f,0-9]{32}$/",$this->password)) $this->password=md5($this->password);
	}
	
	/**
	 * устанавливает префокс для использования разный типов авторизации на одном проекте
	 *
	 * @param string $prefix
	 */
	function  setPrefix($prefix) {
		$this->cookieprofix=$prefix;
		$this->auth();	
	}
	
	/**
	 * Функция подтверждения авторизация
	 */
	function autorise() {
		$this->authorised = 1;
		define('__authorise','yes');
	}
	
	/** 
	 * Добавить проверку авторизации из массива вида:
	 * array('login'=>'password','login2','password2');
	 * 
	 * @param array $userlist
	 * @return bool прошёл ли пользователь регистрацию
	 */
	function addArray($userlist) {
		if (!empty($userlist))
		foreach ($userlist as $login => $password) {
			if ($login == $this->login && $password == $this->password) $this->autorise();
		}		
	}

	/**
	 * Добавить проверку авторизации через заданный SQL запрос,
	 * который возвращает одно поле со значением 0 или 1
	 *
	 * @param string $sql
	 * @param object $db
	 */
	function addSql($sql, $db=null) {
		if ($db==null) global $db;
		if ($db==null) error('Не подключена База Данных');
		$usr=$db->fetchOne($sql,$this->login,$this->password);
		if ($usr > 0) $this->autorise();
	}

	/**
	 * Проверяет авторизован ли пользователь и выполняет заданные действия 
	 */
	function check() {
		if($this->authorised && !empty($_POST['login'])) $this->writeCookies();
		return $this->authorised;
	}
	/**
	 * Добавляет куки
	 */
	function writeCookies() {
		@setcookie($this->cookieprofix.'login', $this->login, time()+360000,'/');
		@setcookie($this->cookieprofix.'password', $this->password, time()+360000,'/');
	}
	
	/**
	 * Стерает куки
	 */
	function logout() {
		setcookie($this->cookieprofix.'login', '', 0,'/');
		setcookie($this->cookieprofix.'password', '', 0,'/');
	}
	
	/**
	 * Проверка правельности email
	 *
	 * @param string $email
	 * @return bool
	 */
	function checkemail($email) {
		return preg_match("/^([\w\.\-])+@([\w\.\-]+\\.)+[a-z]{2,4}$/i", $email);
	}
	
}
?>
